Maven 是一個專案管理與自動化構建的工具,主要用於 Java 的專案。 目前由 Apache 軟體基金會管理。另外一個常見的工具 Gradle,這邊就不多介紹,主要的用途都類似。
是根據專案物件模型(Project Object Model, POM)概念設計,在 pom.xml 檔案中描述專案的基本資訊、與外部模組的依賴關係、建構順序、目錄與外掛程式,並執行 Maven 提供的構建方法就可快速完成編譯、打包等等。剛進入透過 Maven 管理的專案會自動從遠端的程式庫 (mvn repository)下載依賴
當我們剛創建好一個由 Maven 構建的 Spring Boot 專案,他的結構會像是下面這樣
my-spring-boot-app
│   pom.xml
└───src
    └───main
    │   ├───java
    │   │   └───com
    │   │       └───example
    │   │           └───demo
    │   │               └───DemoApplication.java
    │   └───resources
    │       ├───application.properties
    │       └───static
    │       └───templates
    └───test
        └───java
            └───com
                └───example
                    └───demo
                        └───DemoApplicationTests.java

## pom.xml
可以點開 pom.xml
```xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>3.3.2</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.oseanchen</groupId>
	<artifactId>demoproj</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>demoproj</name>
	<description>demoproj</description>
	<url/>
	<licenses>
		<license/>
	</licenses>
	<developers>
		<developer/>
	</developers>
	<scm>
		<connection/>
		<developerConnection/>
		<tag/>
		<url/>
	</scm>
	<properties>
		<java.version>17</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>
這個檔案紀錄目前該專案所有重要構建資訊,
只要你對這份文件上面有進行任何修改 Maven 都會自動根據你的需求重新構建
一些重要資訊說明
可以知道目前運行版本,如果直接改動 reload 後會自動轉換成不同版
<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>3.3.2</version>
</parent>
	<groupId>com.oseanchen</groupId>
	<artifactId>demoproj</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>demoproj</name>
	<description>demoproj</description>
groupId : 通常預設建議是公司或個人名稱及網域
artifactId: groupid 下一層package,通常也是專案名稱
仔細看一下專案結構會發現啟動類就放在 com.oseanchen.demoproj 下面,這也是根據當初建立專案時設定這些內容所產生
version: 專案版本
name: 專案名稱
decription: 專案描述
	<properties>
		<java.version>17</java.version>
	</properties>
<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		
	</dependencies>
這邊可以根據我們需要加入,如果你不確定對應的 gorupId, artifacId 可到 mvn repository 上面搜尋對應的套件名稱及版本(下圖紅框) 就可以根據同樣的格式引入,下面是只有引入 mysql,你可以選擇你要的版本進到最後資訊頁下面有引入的 xml (下圖綠框) 可以直接複製貼到 pom.xml 裡面

再來通常 IDE 都會整合 maven 的構建功能直接讓我們可以使用,也可以透過指令,但要另外安裝 maven 至本機,我這邊以 Intellij 提供 maven 整合的插件做說明,可以直接點選右邊 maven 圖示(我有改過icon,所以原本應該是個 m 的圖示),點開後選擇專案的 package 下面會有一個 life cycle,就可以看到整個專案構件的生命週期分成哪些步驟。

clean 的生命週期時,也就會把 target 資料夾給刪除。當你執行了任何一個 Phase,則 maven 會從第一個 Phase 開始執行,直到你所指定的 Phase 執行完成後才會結束動作,除非中間有遇到問題,例如選擇 package 就會依序 validate → compile → test → package ,如果 test 有未通過就會中斷,測試部分是可以自己配置是否要略過。
實務上這些過程都會根據自身需求調整配置,像是多半現在許多專案都會配合 docker build , push 上雲等等,也可以加入 docker plugin 進行,不一定走完完整的 life cycle,這些就是基本 Maven 的構件 SpringBoot 專案的
Ref:
相關文章也會同步更新我的部落格,有興趣也可以在裡面找其他的技術分享跟資訊。